package com.damBowling.mybolos;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import models.Franja;
import models.Logro;
import models.Reserva;
import models.Socio;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.content.res.Resources;

/**clase desde la cual invocamos todos los webservices
 * @author Antonio Albert
 *
 */
public class BoleraWebserviceInvoker {
	
	
	private static final String reservasWebService = "http://1/api/gestReservaPistas.php";
	//private static final String franjasLibresWebservice = "http://10.2.34.5/api/gestReservaPistas.php?funcion=3";
	
	private String webService;
	private Resources res;
	//Logros
	
	private static final String logrosSocioWebService =  "getLogrosJugador.php";

	private static final String TodosLogrosWebService = "getTodosloslogros.php";

	private static final String datosSocioWebService = "getDatosSocio.php";

	public BoleraWebserviceInvoker(Resources res){
		this.res = res;
		webService = this.res.getString(R.string.server) + "api/";
	}
	
	public BoleraWebserviceInvoker(){
	}
	
	/**metodo que recupera las reservas de un usuario mediante un webservice que ataca a la base de datos
	 * @param usuarioId recibe como parametro el ID del socio que ha hecho login
	 * @return nos devuelve una lista de reservas
	 */
	public List<Reserva> recuperarReservasUsuario(Integer usuarioId) {
		// invocamos al webservice para recuperar las reservas de un usuario
		HttpClient client = new DefaultHttpClient();
		HttpGet request = new HttpGet();
		try {
			request.setURI(new URI(reservasWebService + "?userId=" + usuarioId));
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		HttpResponse response;
		try {
			response = client.execute(request);
			BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
			String json = reader.readLine();
			//invocamos a la clase jsonobject
			JSONObject jsonObj = new JSONObject(json);
			JSONArray array = jsonObj.getJSONArray("reservas");
			//en esta lista se almacenan todas las reservas realizadas
			List<Reserva> reservas = new ArrayList<Reserva>();
			for (int i = 0; i < array.length(); i++) {
				Reserva reserva = BoleraJSONParser.parseReserva(array.getJSONObject(i));
				reservas.add(reserva);
			}
			return reservas;
			// LECTURA DE LA RESPUESTA
		} catch (ClientProtocolException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		} catch (JSONException e) {

			e.printStackTrace();
		}
		return null;

	}

	/**metodo que al ejecutarse invoca un webservice que guarda en la base de datos la reservaque hemos realizado
	 * en nuestro terminal movil
	 * @param reserva recibe la reserva
	 */
	public void guardarReserva(Reserva reserva) {
		HttpClient client = new DefaultHttpClient();
		HttpPost request = new HttpPost();

		try {
			request.setURI(new URI(res.getString(R.string.server) + "/api/gestReservaPistas.php"));
			List<NameValuePair> valores = BoleraJSONParser.getJSONReserva(reserva);
			
			request.setEntity(new UrlEncodedFormEntity(valores));
			HttpResponse response = client.execute(request);
			BufferedReader reader;
			reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
			 String AjsonPUT = reader.readLine(); 
			 System.out.println("asd");
		} catch (URISyntaxException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public List<Logro> recuperaLogrosSocio(Integer socioId)
	{
		HttpClient client = new DefaultHttpClient();
		HttpPut request = new HttpPut();
		HttpResponse response;
		List<Logro> logros = new ArrayList<Logro>();
		try {
			String url=webService+logrosSocioWebService;
			request.setURI(new URI(url+ "?userId=" + socioId));
			System.out.println(logrosSocioWebService+ "?userId=" + socioId);
			response = client.execute(request);
			// LECTURA DE LA RESPUESTA
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					response.getEntity().getContent(), "UTF-8"));
			String json = reader.readLine();
			JSONObject jsonObj = new JSONObject(json);
			JSONArray array = jsonObj.getJSONArray("logros");
			
			for (int i = 0; i < array.length(); i++) {
				Logro logro = BoleraJSONParser.parseLogro(array.getJSONObject(i));
				logros.add(logro);
			}
			return logros;
		} catch (URISyntaxException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {		
			e.printStackTrace();
		} catch (ClientProtocolException e) {		
			e.printStackTrace();
		} catch (IOException e) {	
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return logros;
	}
	
	public List<Logro> recuperaTodosLosLogros()
	{
		HttpClient client = new DefaultHttpClient();
		HttpPut request = new HttpPut();
		HttpResponse response;
		try {
			String url=webService+TodosLogrosWebService;
			request.setURI(new URI(url));
			System.out.println("url:"+url);
			response = client.execute(request);
			// LECTURA DE LA RESPUESTA
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					response.getEntity().getContent(), "UTF-8"));
			String json = reader.readLine();
			JSONObject jsonObj = new JSONObject(json);
			JSONArray array = jsonObj.getJSONArray("logros");
			List<Logro> logros = new ArrayList<Logro>();
			for (int i = 0; i < array.length(); i++) {
				Logro logro = BoleraJSONParser.parseLogro(array.getJSONObject(i));
				logros.add(logro);
			}
			return logros;
		} catch (URISyntaxException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {		
			e.printStackTrace();
		} catch (ClientProtocolException e) {		
			e.printStackTrace();
		} catch (IOException e) {	
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return null;
	}
 
	/**metodo que ejecuta el webservice del login con el cual atacamos a la BD y comprobamos si es
	 * correcto o no los datos insertados 
	 * 
	 * @param user recibe como parametro el usuario
	 * @param pass recibe como parametro el password
	 * @param clave recibe como parametro la clave de paso
	 * @return devuelve un objeto JSON
	 */
	public JSONObject executeLogin(String user, String pass, String clave){
		JSONObject jsonObj = null;
		//Preparar el POST
		HttpClient httpclient = new DefaultHttpClient();
	    HttpPost httppost = new HttpPost(webService + "gestUser.php");
	    List<NameValuePair> valores = new ArrayList<NameValuePair>();
		valores.add(new BasicNameValuePair("user", user));
		valores.add(new BasicNameValuePair("pass", pass));
		valores.add(new BasicNameValuePair("clave", clave));
		try {
			httppost.setEntity(new UrlEncodedFormEntity(valores));
			 HttpResponse response = httpclient.execute(httppost);
			 BufferedReader reader;
				reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
				 String json = reader.readLine(); 
			     jsonObj = new JSONObject(json);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		//Preparar el POST END//
		     return jsonObj;
	}
	
	/** metodo que recupera las franjas de juego que hay disponibles para un fecha y una pista determinadas
	 * @param dia parametro que recibe la fecha 
	 * @param pistaID parametro que recibe el id de la pista
	 * @return devuelve una lista con las franjas disponibles
	 */
	public List<Franja> recuperaFranjasLibresDiaPista(Date dia, int pistaID){
		
				// invocamos al webservice para recuperar las reservas de un usuario
				HttpClient client = new DefaultHttpClient();
				HttpGet request = new HttpGet();
				//para conseguir un String con el formato adecuado utilizamos la clase SimpleDateFormat
				SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
				try {
					String fecha=sdf.format(dia);
					request.setURI(new URI(res.getString(R.string.server) + "/api/gestReservaPistas.php?funcion=3" + "&pista=" + pistaID +"&dia="+fecha));
				} catch (URISyntaxException e) {
					e.printStackTrace();
				}
				HttpResponse response;
				try {
					response = client.execute(request);
					// LECTURA DE LA RESPUESTA
					BufferedReader reader = new BufferedReader(new InputStreamReader(
							response.getEntity().getContent(), "UTF-8"));
					String json = reader.readLine();
					JSONObject jsonObj = new JSONObject(json);
					JSONArray array = jsonObj.getJSONArray("franjas");
					List<Franja> franjas = new ArrayList<Franja>();
					for (int i = 0; i < array.length(); i++) {
						Franja franja = BoleraJSONParser.parseFranja(array.getJSONObject(i));
						franjas.add(franja);
					}
					return franjas;
					// LECTURA DE LA RESPUESTA
				} catch (ClientProtocolException e) {

					e.printStackTrace();
				} catch (IOException e) {

					e.printStackTrace();
				} catch (JSONException e) {

					e.printStackTrace();
				}
				return null;
	}
	
	

	/**
	 * Este m�todo se encarga de ejecutar la consulta al WS de Alquileres pendientes de devoluci�n
	 * 
	 * @param id Identificador del usuario
	 * @param server URL del servidor + api folder
	 * @return objeto HttpResponse que contiene la respuesta JSON
	 */
	public HttpResponse getAlquileresById(String id, String server){
		HttpGet request = null;
		HttpClient client = new DefaultHttpClient();
		request = new HttpGet();
		try {
			request.setURI(new URI(server + "gestReservaMateriales.php?userId="+id+"&funcion=1"));
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		HttpResponse response = null;
			try {
				response = client.execute(request);
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
			}
	
		return response;
	}
	public HttpResponse getAlquilerDetallesById(String id, String server){
		HttpGet request = null;
		HttpClient client = new DefaultHttpClient();
		request = new HttpGet();
		try {
			request.setURI(new URI(server + "gestReservaMateriales.php?userId="+id+"&funcion=2"));
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		HttpResponse response = null;
			try {
				response = client.execute(request);
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
			}
			return response;
	}
	public HttpResponse getReservasDePistaById(String id, String server){
		HttpGet request = null;
		HttpClient client = new DefaultHttpClient();
		request = new HttpGet();
		try {
			request.setURI(new URI(server + "api/gestReservaPistas.php?funcion=1&idSocio="+id));
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		HttpResponse response = null;
			try {
				response = client.execute(request);
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				//e.printStackTrace();
			}
			return response;
	}
	
	public JSONObject modifUsuario(String usuario, String pass, String newpass){
		JSONObject obj=null;
		HttpClient hc =new DefaultHttpClient();
		HttpPost hp = new HttpPost(webService + "gestUser.php");
		List<NameValuePair> datos =new ArrayList<NameValuePair>();
		datos.add(new BasicNameValuePair("userId", usuario));
		datos.add(new BasicNameValuePair("vpassword",pass));
		datos.add(new BasicNameValuePair("modUser", newpass));
		try{
			hp.setEntity(new UrlEncodedFormEntity(datos));
			HttpResponse resp = hc.execute(hp);
			BufferedReader read;
			read= new BufferedReader(new InputStreamReader
					(resp.getEntity().getContent(), "UTF-8"));
			String json =read.readLine();
			obj = new JSONObject(json);
		}catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//Post para modificarUsuario
		return obj;
	}
	public void deleteReservaPista(String id, String server){
		HttpDelete request = null;
		HttpClient client = new DefaultHttpClient();
		request = new HttpDelete();
		try {
			request.setURI(new URI(server + "api/gestReservaPistas.php?id="+id));
			client.execute(request);
		} catch (URISyntaxException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public Socio getDatosSocio(Integer id){
		HttpClient client = new DefaultHttpClient();
		HttpPut request = new HttpPut();
		HttpResponse response;
		try {
			String url=webService+datosSocioWebService+"?userId="+id;
			System.out.println("url:"+url);
			request.setURI(new URI(url));
			response = client.execute(request);
			// LECTURA DE LA RESPUESTA
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					response.getEntity().getContent(), "UTF-8"));
			String json = reader.readLine();
			JSONObject jsonObj = new JSONObject(json);
			Socio socio=BoleraJSONParser.parseSocio(jsonObj);
			return socio;} catch (URISyntaxException e) {
				e.printStackTrace();
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		return null;
	}
		
	
}